package de.gof.ppstool.fertigungsverwaltung;

import java.util.List;
import de.gof.ppstool.fertigungsverwaltung.db.Fehlendeteile;
import de.gof.ppstool.fertigungsverwaltung.db.FehlendeteileNotFoundException;
import de.gof.ppstool.fertigungsverwaltung.db.Fertigungsauftrag;
import de.gof.ppstool.fertigungsverwaltung.db.FertigungsauftragNotFoundException;
import de.gof.ppstool.fertigungsverwaltung.db.Fertigungsauftragsposition;
import de.gof.ppstool.fertigungsverwaltung.db.FertigungsauftragspositionDuplikatException;
import de.gof.ppstool.fertigungsverwaltung.db.FertigungsauftragspositionNotFoundException;

public interface IFertigungsverwaltung {
	static final String NAME = "fertigungsverwaltung";

	/**
	 * Einen Fertigungsauftrag erstellen
	 * @param fertigungsauftrag
	 * @return
	 */
	public Fertigungsauftrag erstelleFertigungsauftrag(
			Fertigungsauftrag fertigungsauftrag);

	/**
	 * Eine Fertigungsauftragsposition erstellen
	 * @param fertigungsauftragsposition
	 * @return
	 * @throws FertigungsauftragspositionDuplikatException  
	 * @throws FertigungsauftragNotFoundException  
	 */
	public Fertigungsauftragsposition erstelleFertigungsauftragsposition(
			Fertigungsauftragsposition fertigungsauftragsposition)
			throws FertigungsauftragspositionDuplikatException,
			FertigungsauftragNotFoundException;

	/**
	 * Findet alle Fertigungsauftraege in der Datenbank
	 * @return  Liste mit gefundenen Fertigungsauftraegen
	 * @throws FertigungsauftragNotFoundException  
	 */
	public List<Fertigungsauftrag> findeAlleFertigungsauftraege()
			throws FertigungsauftragspositionNotFoundException,
			FertigungsauftragNotFoundException;

	/**
	 * Findet einen Fertigungsauftrag nach ID
	 * @param id
	 * @return
	 * @throws FertigungsauftragNotFoundException
	 */
	public Fertigungsauftrag findeFertigungsauftragNachId(Long id)
			throws FertigungsauftragNotFoundException;

	/**
	 * Findet alle Fertigungsauftraege fuer einen bestimmten Auftragstag	
	 * @param auftragstag
	 * @return
	 * @throws FertigungsauftragNotFoundException
	 */
	public List<Fertigungsauftrag> findeFertigungsauftraegeNachAuftragstag(
			Long auftragstag) throws FertigungsauftragNotFoundException;

	/**
	 * Findet alle Fertigungsauftragspositionen 
	 * @return  Liste mit gefundenen Fertigungsauftraegen
	 * @throws FertigungsauftragspositionNotFoundException  
	 */
	public List<Fertigungsauftragsposition> findealleFertigungsauftragspositionen()
			throws FertigungsauftragspositionNotFoundException;

	/**
	 * Findet alle Fertigungsauftragspositionen nach Fertigungsauftragsid 
	 * @return  Liste mit gefundenen Fertigungsauftraegen
	 * @throws FertigungsauftragspositionNotFoundException  
	 */
	public List<Fertigungsauftragsposition> findeFertigungsauftragspositionenNachFertigungsauftrag(
			Long id);

	/**
	 * Findet einen Fertigungsauftragpositionen nach ID
	 * @param id
	 * @return
	 * @throws FertigungsauftragspositionNotFoundException
	 */
	public Fertigungsauftragsposition findeFertigungsauftragspositionNachId(
			Long Id) throws FertigungsauftragspositionNotFoundException;

	/**
	 * Aendert einen Fertigungsauftrag
	 * @param fertigungsauftrag
	 * @return
	 */
	public Fertigungsauftrag aendereFertigungsauftrag(
			Fertigungsauftrag fertigungsauftrag);

	/**
	 * Aendert eine Fertigungsauftragsposition
	 * @param fertigungsauftragsposition
	 * @return
	 */
	public Fertigungsauftragsposition aendereFertigungsauftragsposition(
			Fertigungsauftragsposition fertigungsauftragsposition);

	/**
	 * @param fertigungsauftrag
	 * @throws FertigungsauftragspositionDeleteFertigungsauftragException
	 */
	public void loescheFertigungsauftrag(Fertigungsauftrag fertigungsauftrag)
			throws FertigungsauftragspositionDeleteFertigungsauftragException;

	/**
	 * Loesche Fertigungsauftragsposition
	 * @param fertigungsauftragsposition
	 * @throws FehlendeteileDeleteFertigungsauftragspositionException  
	 * @throws FehlendeteileNotFoundException  
	 */
	public void loescheFertigungsauftragsposition(
			Fertigungsauftragsposition fertigungsauftragsposition)
			throws FehlendeteileDeleteFertigungsauftragspositionException,
			FehlendeteileNotFoundException;

	/**
	 * @param fehlendeteile
	 * @return
	 */
	Fehlendeteile erstelleFehlendeteile(Fehlendeteile fehlendeteile)
			throws FehlendeteileNotFoundException;

	/**
	 * @param fehlendeteile
	 * @return
	 */
	Fehlendeteile aendereFehlendeteile(Fehlendeteile fehlendeteile)
			throws FehlendeteileNotFoundException;

	/**
	 * @param fehlendeteile
	 */
	void loescheFehlendeteile(Fehlendeteile fehlendeteile);

	/**
	 * @param fehlendeteileId
	 * @return
	 * @throws FehlendeteileNotFoundException
	 */
	Fehlendeteile findeFehlendeteileNachId(Long fehlendeteileId)
			throws FehlendeteileNotFoundException;

	/**
	 * @return
	 * @throws FehlendeteileNotFoundException
	 */
	List<Fehlendeteile> findeAlleFehlendeTeile()
			throws FehlendeteileNotFoundException;

	/**
	 * @return
	 * @throws FertigungsauftragNotFoundException
	 */
	Fertigungsauftrag findeFertigungsauftragNachBemerkung(String bemerkung)
			throws FertigungsauftragNotFoundException;

}
